package com.smart.community.property.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.util.concurrent.atomic.AtomicLong;

/**
 * 物业公司统计监控服务
 * 监控统计服务的性能指标和缓存状态
 * 
 * 缓存管理器说明：
 * - 使用统一的Caffeine缓存管理器
 * - 自动注入@Primary标记的CacheManager
 * - 支持所有缓存操作的监控和统计
 * 
 * @author Wu.Liang
 * @since 2025-01-30
 * @version 1.2.0 - 统一缓存管理器：使用Caffeine缓存管理器
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class PropertyCompanyStatisticsMonitorService {

    private final CacheManager cacheManager;

    // 性能统计计数器
    private final AtomicLong totalRequests = new AtomicLong(0);
    private final AtomicLong cacheHits = new AtomicLong(0);
    private final AtomicLong cacheMisses = new AtomicLong(0);
    private final AtomicLong totalResponseTime = new AtomicLong(0);

    /**
     * 记录请求统计
     * 
     * @param isCacheHit 是否命中缓存
     * @param responseTime 响应时间（毫秒）
     */
    public void recordRequest(boolean isCacheHit, long responseTime) {
        totalRequests.incrementAndGet();
        totalResponseTime.addAndGet(responseTime);
        
        if (isCacheHit) {
            cacheHits.incrementAndGet();
        } else {
            cacheMisses.incrementAndGet();
        }
    }

    /**
     * 获取缓存命中率
     * 
     * @return 缓存命中率（百分比）
     */
    public double getCacheHitRate() {
        long total = totalRequests.get();
        if (total == 0) {
            return 0.0;
        }
        return (double) cacheHits.get() / total * 100;
    }

    /**
     * 获取平均响应时间
     * 
     * @return 平均响应时间（毫秒）
     */
    public double getAverageResponseTime() {
        long total = totalRequests.get();
        if (total == 0) {
            return 0.0;
        }
        return (double) totalResponseTime.get() / total;
    }

    /**
     * 获取总请求数
     * 
     * @return 总请求数
     */
    public long getTotalRequests() {
        return totalRequests.get();
    }

    /**
     * 获取缓存命中数
     * 
     * @return 缓存命中数
     */
    public long getCacheHits() {
        return cacheHits.get();
    }

    /**
     * 获取缓存未命中数
     * 
     * @return 缓存未命中数
     */
    public long getCacheMisses() {
        return cacheMisses.get();
    }

    /**
     * 定时输出性能统计信息
     * 每5分钟输出一次统计信息
     */
    @Scheduled(fixedRate = 300000) // 5分钟
    public void logPerformanceStats() {
        long total = totalRequests.get();
        if (total > 0) {
            double hitRate = getCacheHitRate();
            double avgResponseTime = getAverageResponseTime();
            
            log.info("物业公司统计服务性能统计 - 总请求数: {}, 缓存命中率: {:.2f}%, 平均响应时间: {:.2f}ms", 
                    total, hitRate, avgResponseTime);
        }
    }

    /**
     * 定时输出缓存状态信息
     * 每10分钟输出一次缓存状态
     */
    @Scheduled(fixedRate = 600000) // 10分钟
    public void logCacheStatus() {
        try {
            Cache propertyCompanyStatsCache = cacheManager.getCache("propertyCompanyStats");
            if (propertyCompanyStatsCache != null) {
                // 这里可以获取缓存的更多信息，如大小、内存使用等
                log.info("物业公司统计缓存状态 - 缓存名称: {}", propertyCompanyStatsCache.getName());
            }
        } catch (Exception e) {
            log.warn("获取缓存状态信息失败", e);
        }
    }

    /**
     * 重置性能统计
     * 用于测试或定期清理
     */
    public void resetStatistics() {
        totalRequests.set(0);
        cacheHits.set(0);
        cacheMisses.set(0);
        totalResponseTime.set(0);
        log.info("物业公司统计服务性能统计已重置");
    }
}
